#ifndef NETWORKINFO_H
#define NETWORKINFO_H

#include <QObject>
#include <QString>
#include <QStringList>
#include <QMap>
#include <QTimer>
#include <QProcess>
#include <QDateTime>

// 网络连接状态枚举
enum class ConnectionStatus {
    Unknown,
    Connected,
    Disconnected,
    Connecting,
    Disconnecting
};

// 网络设备类型枚举
enum class DeviceType {
    Unknown,
    Ethernet,
    WiFi,
    Loopback,
    Bridge,
    Bond,
    Vlan
};

// 网络连接信息结构
struct ConnectionInfo {
    QString name;           // 连接名称
    QString uuid;           // 连接UUID
    QString device;         // 设备名称
    DeviceType type;        // 设备类型
    ConnectionStatus status; // 连接状态
    QString ipAddress;      // IP地址
    QString netmask;        // 子网掩码
    QString gateway;        // 网关
    QString dns;           // DNS服务器
    QString macAddress;    // MAC地址
    bool isActive;         // 是否激活
    QString iconPath;      // 图标路径
    QString ipv6Address;      // IPv6地址
    QString ipv6Gateway;      // IPv6网关
    QString ipv6Dns;          // IPv6 DNS
    QDateTime activatedAt;    // 激活时间
    QString speed;            // 连接速率
    bool hasInternet = false; // 是否有互联网访问
    bool hasInternetV4 = false; // IPv4连通性
    bool hasInternetV6 = false; // IPv6连通性
    bool dhcp = false;
    QString wins;
    bool netbios = false;
    QString ipv4Method; // 新增字段，记录ipv4.method
    // 新增：多IP多掩码支持
    QStringList ipAddresses;  // 所有IPv4地址
    QStringList netmasks;     // 对应的子网掩码
};

// 网络设备信息结构
struct DeviceInfo {
    QString name;           // 设备名称
    DeviceType type;        // 设备类型
    bool isEnabled;         // 是否启用
    QString macAddress;     // MAC地址
    QString driver;         // 驱动名称
    QString firmware;       // 固件版本
    QString hwAddress;      // 硬件地址
    QStringList capabilities; // 设备能力
    QString speed;            // 物理速率
    QString state;            // 物理状态
    QString ipAddress;        // IPv4地址
    QString ipv6Address;      // IPv6地址
    QString gateway;          // 网关
    QString ipv6Gateway;
    QString dns;
    QString netmask;
    QString ipv6Dns;         // 新增：IPv6 DNS
    QString model;           // 新增：物理型号描述
};

// 网络统计信息结构
struct NetworkStats {
    qint64 bytesReceived;   // 接收字节数
    qint64 bytesSent;       // 发送字节数
    qint64 packetsReceived; // 接收包数
    qint64 packetsSent;     // 发送包数
    qint64 errorsReceived;  // 接收错误数
    qint64 errorsSent;      // 发送错误数
};

class NetworkInfo : public QObject
{
    Q_OBJECT

public:
    explicit NetworkInfo(QObject *parent = nullptr);
    ~NetworkInfo();

    // 获取所有网络连接信息
    QList<ConnectionInfo> getAllConnections();
    
    // 获取所有网络设备信息
    QList<DeviceInfo> getAllDevices();
    
    // 获取指定设备的统计信息
    NetworkStats getDeviceStats(const QString &deviceName);
    // 强制刷新并返回最新统计
    void forceRefreshDeviceStats(const QString &deviceName);
    
    // 获取网络状态概览
    QString getNetworkStatus();
    
    // 刷新所有网络信息
    void refreshAll();
    
    // 设置自动刷新间隔（毫秒），0表示禁用自动刷新
    void setAutoRefreshInterval(int interval);
    
    // 获取最后更新时间
    QDateTime getLastUpdateTime() const;

    // 获取设备图标路径
    QString getDeviceIconPath(DeviceType type, ConnectionStatus status);

    // 新增：互联网连通性检测
    void updateInternetConnectivity(); // 异步检测所有连接
    static bool checkInternetConnectivity(const QString &ip); // 单个IP检测
    void updateInternetConnectivityFromNmcli(); // 新增：用nmcli networking connectivity检测全局互联网连通性
    // 新增：格式化持续时间
    static QString getConnectionDuration(const ConnectionInfo &conn);
    // 新增：美化速率单位
    static QString getSpeedString(const QString &speedStr);

    // 新增：根据设备名获取DHCP状态
    static QString getDHCPStatusByDevice(const QString &deviceName);

    // 新增：直接读取/proc/net/dev获取实时字节数
    static NetworkStats getDeviceStatsFromProc(const QString &deviceName);

signals:
    // 网络信息更新信号
    void networkInfoUpdated();
    
    // 连接状态变化信号
    void connectionStatusChanged(const QString &connectionName, ConnectionStatus status);
    
    // 设备状态变化信号
    void deviceStatusChanged(const QString &deviceName, bool isEnabled);
    
    // 错误信号
    void errorOccurred(const QString &error);

    // 新增：设备统计信息更新信号
    void deviceStatsUpdated(const QString &deviceName, const NetworkStats &stats);

private slots:
    // 自动刷新定时器槽函数
    void onAutoRefreshTimer();
    
    // nmcli进程完成槽函数
    void onNmcliProcessFinished(int exitCode, QProcess::ExitStatus exitStatus);
    
    // nmcli进程错误槽函数
    void onNmcliProcessError(QProcess::ProcessError error);

private:
    // 解析nmcli输出
    QList<ConnectionInfo> parseConnectionList(const QString &output);
    QList<DeviceInfo> parseDeviceList(const QString &output);
    NetworkStats parseDeviceStats(const QString &output);
    // 新增：解析nmcli device status
    void updateDeviceStatusMap(const QString &output);
    
    // 执行nmcli命令
    void executeNmcliCommand(const QStringList &args);
    void executeNmcliCommandWithOutput(const QString &output);
    
    // 转换状态字符串为枚举
    ConnectionStatus parseConnectionStatus(const QString &status);
    DeviceType parseDeviceType(const QString &type);

private:
    QTimer *m_autoRefreshTimer;
    QProcess *m_nmcliProcess;
    QDateTime m_lastUpdateTime;
    
    // 缓存的数据
    QList<ConnectionInfo> m_cachedConnections;
    QList<DeviceInfo> m_cachedDevices;
    QMap<QString, NetworkStats> m_cachedStats;
    // 新增：设备状态缓存
    QMap<QString, ConnectionStatus> m_deviceStatusMap;
    
    // 当前执行的命令类型
    enum class CommandType {
        None,
        Connections,
        Devices,
        Stats
    };
    CommandType m_currentCommand;
    QString m_currentDevice; // 用于统计信息查询
    bool isInternalUpdate = false;
};

#endif // NETWORKINFO_H 